题目描述
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。
返回删除后的链表的头节点。
注意: 此题对比原题有改动
示例 1:
1 2 3
| 输入: head = [4,5,1,9], val = 5 输出: [4,1,9] 解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.
|
示例 2:
1 2 3
| 输入: head = [4,5,1,9], val = 1 输出: [4,5,9] 解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.
|
说明:
- 题目保证链表中节点的值互不相同
- 若使用 C 或 C++ 语言,你不需要 $free$ 或 $delete$ 被删除的节点
算法
(链表) $O(n)$
要删除指定值的节点,那么头节点也可能被删除,所以建立一个虚拟头节点 $dummy$ 和两个指针 $p、q$,$p$ 指向当前遍历节点的前一个位置,$q$ 指向当前节点,遍历链表如果当前节点的值等于 $val$ 则删除 p->next = q->next
,否则继续往后找。
时间复杂度
$O(n)$
空间复杂度
$O(n)$
C++ 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
|
class Solution { public: ListNode* deleteNode(ListNode* head, int val) { auto dummy = new ListNode(-1); dummy->next = head;
auto p = dummy, q = p->next; while (q) if (q->val == val) { p->next = q->next; break; } else { p = q, q = q->next; } return dummy->next; } };
|